package net.ib.mtalk.service;

import java.util.ArrayList;

import net.ib.mntalk.protocol.Common.NotificationInfo;
import net.ib.mtalk.util.MTalkLogWriter;
import android.content.Context;
import android.os.Handler;

public class SelectResultHandler {
	
	private static Context mContext;
	private static Handler mHandler;
	private static ArrayList<SelectResultHandler> mWorks;

	static void readyWork(Handler handler) {
		mHandler = handler;
		mWorks = new ArrayList<SelectResultHandler>();
	}
	
	static void enqueWork(SelectResultHandler workHandler) {
		if (mWorks != null) {
			mWorks.add(workHandler);
		}
	}
	
	static void launchAllWorks() {
		if (mWorks != null) {
			MTalkLogWriter.d("SelectResultHandler.launchAllWorks(): starting "+mWorks.size()+" works");
			for (SelectResultHandler element : mWorks) {
				element.onWork(mHandler);
			}
		}
	}
	
	SelectResultHandler(Context context, NotificationInfo notificationInfo) {
		mContext = context;
	}

	/**
	 * 각 루틴은 이 메소드 안에 자기 작업을 구현한다.
	 * 작업이 끝난 시점에 {@link #finish()}를 반드시 호출해야 한다.
	 * 네트워크 리턴이 안 와서 {@link #finish()}를 호출하지 못한다거나 하는 일이 있어서는 안 된다.
	 * @param handler 서비스의 worker 스레드의 핸들러
	 * @param notificationInfo
	 */
	protected void onWork(Handler handler) {
		// do nothing
	}

	/**
	 * 이 메소드는 {@link #onWork(Handler)}가 호출된 이후에 호출되어야 한다.
	 * 모든 처리 루틴은 자기 작업이 끝났을 때 이 메소드를 호출해야 하며, 한 번만 호출해야 한다.
	 */
	protected void finish() {
		if (mWorks != null) {
			mWorks.remove(this);
			MTalkLogWriter.v("SelectResultHandler.finish(): finished one");
			if (mWorks.size() <= 0) {
				mWorks = null;
				MTalkLogWriter.d("SelectResultHandler.finish(): finished all");
				SelecterService.actionStop(mContext);
				SelecterService.actionStart(mContext);
			}
		}
	}

}
